// #include <iostream>
// #include <unistd.h>
// #include <signal.h>
// #include <sys/types.h>
// #include <sys/wait.h>

// class Thread
// {
// public:
//     std::string name;
//     int num;
// };

// void *threadStart(void *args)
// {
//     // while (true)
//     // {
//     //     sleep(1);
//     //     std::cout << "new thread running..." << ", pid: " << getpid() << std::endl;
//     // }
//     int cnt = 9;
//     Thread *th = (Thread *)args;
//     while (cnt--)
//     {
//         std::cout << "The thread's name is " << th->name << ", pid: " << getpid() << ", cnt:" << cnt << std::endl;
//         sleep(1);
//     }
//     return (void *)256;
// }

// int main()
// {
//     pthread_t tid;
//     Thread *newthread = new Thread;
//     newthread->name = "thread_1";
//     newthread->num = 1;
//     int n = pthread_create(&tid, nullptr, threadStart, (void *)newthread);
//     if (n != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }

//     // while (true)
//     // {
//     //     std::cout << "main thread running..." << ", pid: " << getpid() << std::endl;
//     //     sleep(1);
//     // }

//     void *code = nullptr;
//     n = pthread_join(tid, &code);
// if (n == 0)
// {
//     std::cout << "main thread wait success, newthread exit code is " << (uint64_t)code << std::endl;
// }
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <signal.h>
// #include <sys/types.h>
// #include <sys/wait.h>

// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// void *threadStart(void *args)
// {
//     std::string *name = (std::string *)args;
//     while (true)
//     {
//         pthread_mutex_lock(&mutex);
//         std::cout << "I am " << *name << std::endl;
//         pthread_mutex_unlock(&mutex);
//         sleep(1);
//     }
//     return (void *)0;
// }

// int main()
// {
//     pthread_t tid;
//     std::string *thread_a = new std::string("thread_A");
//     std::string *thread_b = new std::string("thread_B");
//     int n1 = pthread_create(&tid, nullptr, threadStart, (void *)thread_a);
//     if (n1 != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }
//     int n2 = pthread_create(&tid, nullptr, threadStart, (void *)thread_b);
//     if (n2 != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }

// void *code = nullptr;
// n1 = pthread_join(tid, &code);
//     if (n1 == 0)
//     {
//         std::cout << "main thread wait success, newthread exit code is " << (uint64_t)code << std::endl;
//     }
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <signal.h>
// #include <sys/types.h>
// #include <sys/wait.h>
// #include <functional>

// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// void *one(void *)
// {
//     printf("one\n");
//     return nullptr;
// }
// void *two(void *)
// {
//     printf("two\n");
//     return nullptr;
// }
// void *three(void *)
// {
//     printf("three\n");
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     std::string *thread_a = new std::string("thread_1");
//     std::string *thread_b = new std::string("thread_2");
//     std::string *thread_c = new std::string("thread_3");

//     int n1 = pthread_create(&tid, nullptr, one, (void *)thread_a);
//     if (n1 != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }

//     int n2 = pthread_create(&tid, nullptr, two, (void *)thread_b);
//     if (n2 != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }

//     int n3 = pthread_create(&tid, nullptr, three, (void *)thread_b);
//     if (n3 != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }

//     sleep(3);

//     void *code = nullptr;
//     n1 = pthread_join(tid, &code);
//     if (n1 == 0)
//     {
//         std::cout << "main thread wait success, newthread exit code is " << (uint64_t)code << std::endl;
//     }
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <sys/types.h>
// #include <sys/wait.h>
// #include <functional>
// #include <signal.h>

// void *threadStart(void *args)
// {
//     std::string name = static_cast<char *>(args);
//     while (true)
//     {
//         sleep(1);
//         //std::cout << name << " is running..." << std::endl;
//         std::cout << name << " is running..." << ", getpid(): " << getpid() << " , pthread_self():" << pthread_self() << std::endl;
//     }
//     return (void*)1;
// }

// int main()
// {
//     pthread_t tid1;
//     int n = pthread_create(&tid1, nullptr, threadStart, (void *)"thread-1");
//     if (n != 0)
//     {
//         std::cout << "pthread_create error" << std::endl;
//         return 1;
//     }

//     void *code = nullptr;
//     n = pthread_join(tid1, &code);
//     if (n == 0)
//     {
//         std::cout << "main thread wait success, newthread exit code is " << (uint64_t)code << std::endl;
//     }

//     // pthread_t tid2;
//     // n = pthread_create(&tid2, nullptr, threadStart, (void *)"thread-2");
//     // if (n != 0)
//     // {
//     //     std::cout << "pthread_create error" << std::endl;
//     //     return 1;
//     // }

//     return 0;
// }

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <functional>
#include <signal.h>
#include "LockGuard.hpp"

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void *threadStart(void *args)
{
    std::string name = static_cast<char *>(args);
    while (true)
    {
        sleep(1);
        std::cout << name << " is running..." << ", getpid(): " << getpid() << " , pthread_self():" << pthread_self() << std::endl;
    }
    return (void *)1;
}

int main()
{
    pthread_t tid1;
    int n = pthread_create(&tid1, nullptr, threadStart, (void *)"thread-1");
    if (n != 0)
    {
        std::cout << "pthread_create error" << std::endl;
        return 1;
    }

    while (true)
    {
        sleep(1);
        std::cout << "main is running..." << std::endl;
    }

    void *code = nullptr;
    n = pthread_join(tid1, &code);
    if (n == 0)
    {
        std::cout << "main thread wait success, newthread exit code is " << (uint64_t)code << std::endl;
    }

    return 0;
}
